/******************************************************************************
 * @file     bsp_aht21_driver.h
 * @brief    提供AHT21的hal接口
 * @author   Ruilst
 * @date     2025-08-14
 * @version  V1.0.0
 * @copyright Copyright (c) 2025
 *
 * @note     1 tab = 4 space
 *           include:
 *           stdio.h
 *           stdint.h
 * @par 日志:
 * - V1.0.0 2025-08-14 Ruilst
 *****************************************************************************/

#ifndef __BSP_AHT21_DRIVER_H__
#define __BSP_AHT21_DRIVER_H__

//******************************** Includes *********************************//

#include <stdio.h>
#include <stdint.h>

#include "bsp_aht21_reg.h"

//******************************** Includes *********************************//

//******************************** Defines **********************************//

#define OS_SUPPORTING  // 支持OS操作系统
#define DEBUG          // 开启DEBUG模式

#ifdef DEBUG
#include "elog.h"
#define DEBUG_OUT( X ) log_e( X ) /*DEBUG调试信息输出接口*/
#endif                            // DEBUG

// #define HARDWARE_IIC //开启硬件IIC，不定义则为软件IIC

//******************************** Defines **********************************//

//*********************Thread_Func **********************//

//*********************Thread_Func **********************//

//*********************Queue_Handler ********************//

//*********************Queue_Handler ********************//

//******************************** Declaring ********************************//

/**
 * @enum aht21_status_t
 * @brief AHT21相关函数的返回值
 */
typedef enum
{
    AHT21_OK             = 0,    // 函数操作成功
    AHT21_ERROR          = 1,    // 函数操作失败
    AHT21_ERRORTIMEOUT   = 2,    // 函数操作超时
    AHT21_ERRORRESOURCE  = 3,    // 函数资源不可用
    AHT21_ERRORPARAMETER = 4,    // 函数传入参数错误
    AHT21_ERRORNOMEMORY  = 5,    // 内存不足
    AHT21_ERRORISR       = 6,    // ISR中操作失败
    AHT21_RESERVED       = 0xFF  // 保留段
} aht21_status_t;

#ifndef HARDWARE_IIC  // 使用软件IIC
// 软件IIC函数接口结构体
typedef struct
{
    aht21_status_t ( *pf_iic_init )( void );         // 初始化IIC接口
    aht21_status_t ( *pf_iic_deinit )( void );       // 反初始化IIC接口

    aht21_status_t ( *pf_iic_start )( void );        // 发送IIC起始信号
    aht21_status_t ( *pf_iic_stop )( void );         // 发送IIC停止信号
    aht21_status_t ( *pf_iic_wait_ack )( void );     // 等待从设备返回的应答信号
    aht21_status_t ( *pf_iic_send_ack )( void );     // 向从设备发送应答信号
    aht21_status_t ( *pf_iic_send_no_ack )( void );  // 向从设备发送非应答信号

    aht21_status_t ( *pf_iic_send_byte )(
        uint8_t  addr,
        uint8_t *p_data);  // 通过IIC总线发送字节数据
    aht21_status_t ( *pf_iic_rec_byte )(
        uint8_t  addr,
        uint8_t *p_data);  // 通过IIC总线接收字节数据

#ifdef OS_SUPPORTING
    aht21_status_t ( *pf_critical_enter )( void );  // 进入临界区，保护IIC操作不被中断
    aht21_status_t ( *pf_critical_exit )( void );   // 退出临界区，恢复系统中断响应
#endif                                              // OS_SUPPORTING

} iic_driver_interface_t;
#endif  // !HARDWARE_IIC

#ifdef HARDWARE_IIC  // 使用硬件IIC
// 硬件IIC函数接口结构体
typedef struct
{
    uint8_t ( *pf_iic_init )( void * );                   // 初始化IIC接口
    uint8_t ( *pf_iic_deinit )( void * );                 // 反初始化IIC接口
    void ( *pf_iic_send_ack )( void * );                  // 向从设备发送应答信号
    void ( *pf_iic_send_no_ack )( void * );               // 向从设备发送非应答信号
    void ( *pf_iic_send_byte )( void *, const uint8_t );  // 通过IIC总线发送一个字节数据
    uint8_t ( *pf_iic_rec_byte )( void * );               // 通过IIC总线接收一个字节数据
} iic_driver_interface_t;
#endif  // HARDWARE_IIC

#ifndef HARDWARE_IIC
// 获取时间基准函数结构体
typedef struct
{
    uint32_t ( *pf_get_tick )( void );  // 获取时间基准
} time_base_interface_t;
#endif  // HARDWARE_IIC

#ifdef OS_SUPPORTING
// os切换空闲线程延时函数结构体
typedef struct
{
    void ( *os_yield )( const uint32_t );  // 操作系统延时函数
} os_yield_interface_t;
#endif  // OS_SUPPORTING

// aht21实例结构体
typedef struct
{
    iic_driver_interface_t *p_iic_driver_instance;  // 指向IIC驱动接口实例的指针
#ifndef HARDWARE_IIC
    time_base_interface_t *p_time_base_instance;  // 指向时间基准接口实例的指针
#endif                                            // HARDWARE_IIC
#ifdef OS_SUPPORTING
    os_yield_interface_t *p_os_yield_instance;  // 指向操作系统任务让出接口实例的指针
#endif                                          // OS_SUPPORTING

    // 用于实例化AHT21驱动的函数指针，完成驱动实例的创建与资源绑定
    aht21_status_t ( *pf_aht21_instance_inst )(
        void *const p_self_instance,
        // 指向当前BSP AHT21驱动实例自身的指针
        iic_driver_interface_t *const p_iic_driver_instance,  // 用于绑定IIC通信功能
#ifndef HARDWARE_IIC
        time_base_interface_t *const p_time_base_instance,  // 用于绑定时间相关功能
#endif                                                      // HARDWARE_IIC
#ifdef OS_SUPPORTING
        os_yield_interface_t *const p_os_yield_instance  // 用于绑定任务调度功能
#endif                                                   // OS_SUPPORTING
    );
    // 初始化AHT21驱动实例的函数指针
    aht21_status_t ( *pf_aht21_instance_init )( void *const );
    // 反初始化AHT21驱动实例的函数指针
    aht21_status_t ( *pf_aht21_instance_deinit )( void *const );
    // 读取AHT21传感器ID的函数指针
    aht21_status_t ( *pf_read_aht21_id )( void *const );
    // 读取AHT21温湿度度数据的函数指针
    aht21_status_t ( *pf_read_aht21_t_h )( void *const,
                                           float *const temp,
                                           float *const humi );
    // 读取AHT21湿度数据的函数指针
    aht21_status_t ( *pf_read_aht21_humidity )( void *const,
                                                float *const humi );
    // 进入睡眠模式的函数指针
    aht21_status_t ( *pf_aht21_sleep )( void *const );
    // 从睡眠模式唤醒的函数指针
    aht21_status_t ( *pf_aht21_wakeup )( void *const );
    // 实例初始化状态
    uint8_t init_state;
} bsp_aht21_driver_t;

/**
 * @brief   aht21实例挂载函数接口函数
 *
 * @param   bsp_aht21_driver_t *const p_self_instance            aht21实例结构体指针
 * @param   iic_driver_interface_t *const p_iic_driver_instance  IIC驱动函数指针
 * @param   time_base_interface_t *const  p_time_base_instance   时基函数指针
 * @param   os_yield_interface_t *const p_os_yield_instance      OS延时函数指针
 *
 * @return  aht21_status_t 函数运行状态
 *
 * @retval  AHT21_OK                操作成功
 * @retval  AHT21_ERRORPARAMETER   传入参数错误
 */
aht21_status_t aht21_instance_inst(
    bsp_aht21_driver_t *const p_self_instance,
    // 指向当前BSP AHT21驱动实例自身的指针
    iic_driver_interface_t *const p_iic_driver_instance,  // 用于绑定IIC通信功能
#ifndef HARDWARE_IIC
    time_base_interface_t *const p_time_base_instance,  // 用于绑定时间相关功能
#endif                                                  // HARDWARE_IIC
#ifdef OS_SUPPORTING
    os_yield_interface_t *const p_os_yield_instance  // 用于绑定任务调度功能
#endif                                               // OS_SUPPORTING
);

//******************************** Declaring ********************************//

#endif  // End of __BSP_AHT21_DRIVER_H__
